/**
* ESP8266 连接 SPI接口7针引脚的OLED 并输出 HelloWorld
*/

// 引入U8g2图形库，用于驱动OLED显示屏
#include <U8g2lib.h>

// 定义SPI接口上OLED模块的相关引脚
// OLED片选信号（Chip Select）连接至D0引脚
#define OLED_CS D0
// 数据/命令选择信号（Data/Command）连接至D1引脚
#define OLED_DC D1
// OLED复位信号（Reset）连接至D2引脚（可选，如果没有物理连接复位引脚，则不需要此定义）
#define OLED_RST D2

// 创建一个U8g2对象实例，指定OLED型号为SSD1306，分辨率为128x64，采用4线软件SPI模式及对应的引脚配置
U8G2_SSD1306_128X64_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ D5, /* data=*/ D7, /* cs=*/ OLED_CS, /* dc=*/ OLED_DC, /* reset=*/ OLED_RST);

// 设置函数：初始化串口通信以及OLED模块相关引脚
void setup() {
  // 初始化Serial串口通信，波特率为115200
  Serial.begin(115200);

  // 将OLED的片选和数据/命令选择引脚设为输出模式
  pinMode(OLED_CS, OUTPUT);
  pinMode(OLED_DC, OUTPUT);

  // 若OLED有连接复位引脚，则对其进行初始化操作
  if (OLED_RST != NOT_A_PIN) {
    pinMode(OLED_RST, OUTPUT);

    // 先将复位引脚拉高，然后短暂拉低以完成OLED模块的硬件复位
    digitalWrite(OLED_RST, HIGH);
    delay(100);
    digitalWrite(OLED_RST, LOW);
    delay(100);
    digitalWrite(OLED_RST, HIGH);
  }

  // 开始初始化U8g2库与OLED显示屏之间的通信
  u8g2.begin();
}

// 循环函数：在此函数内编写循环执行的代码，如更新OLED显示内容
void loop() {
  // 清除OLED显示缓存
  u8g2.clearBuffer();

  // 设置字体为ncenB14_tr样式
  u8g2.setFont(u8g2_font_ncenB14_tr);

  // 在坐标(0, 20)处写入英文字符串"HelloWorld"
  u8g2.drawStr(0, 20, "HelloWorld");

  // 将缓冲区中的内容发送至OLED显示屏进行显示
  u8g2.sendBuffer();

  // 延迟2秒后再进行下一轮显示更新
  delay(2000);
}
